package com.pureut.system.api;


import com.pureut.common.core.constant.ServiceNameConstants;
import com.pureut.common.core.web.domain.AjaxResult;
import com.pureut.system.api.dto.PurchaseOrderDto;
import com.pureut.system.api.factory.RemoteStorageFallbackFactory;
import com.pureut.system.api.vo.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * @author: CM
 * @date: 2023/2/7    10:43
 */
@FeignClient(contextId = "storageFegin", value = ServiceNameConstants.PUREUT_STORAGE, fallbackFactory = RemoteStorageFallbackFactory.class)
public interface StorageFegin {

    /**
     * 生产领料新增
     *
     * @param feginProductionPickingVo
     * @return
     */
    @PostMapping("/productionPicking/addAutoProduction")
    public AjaxResult add(@RequestBody FeginProductionPickingVo feginProductionPickingVo);

    /**
     * 脱脂模块生成生产领料单(fegin调用)
     */
    @PostMapping("/productionPicking/addAutoProductionByDegreas")
    public AjaxResult addAutoProductionByDegreas(@RequestBody FeginProductionPickingVo feginProductionPickingVo);

    /**
     * 根据母卷号码查询库存信息
     *
     * @param masterVolumeNumber
     * @return
     */
    @GetMapping("/wmsStock/selectMasterVolumeList/{masterVolumeNumber}")
    public AjaxResult selectMasterVolumeList(@PathVariable("masterVolumeNumber") String masterVolumeNumber);

    /**
     * 根据母卷号码修改库存卷长
     *
     * @param wmsStockInfoVo
     * @return
     */
    @PutMapping("/wmsStock/updateStockInfoById")
    public AjaxResult updateStockInfoById(@RequestBody WmsStockInfoVo wmsStockInfoVo);

    /**
     * 删除库存
     *
     * @param truncationMasterVolumeNumber
     * @return
     */
    @DeleteMapping("/wmsStock/delete/{truncationMasterVolumeNumber}")
    public AjaxResult remove(@PathVariable("truncationMasterVolumeNumber") String truncationMasterVolumeNumber);

    /**
     * 根据物料编码和批次号获取仓库信息
     */
    @GetMapping("/wmsStock/getMessage")
    public AjaxResult getStockInfo(@RequestParam("wmsStockInfoVo") WmsStockInfoVo wmsStockInfoVo);

    /**
     * 根据物料号码修改单据状态
     */
    @PostMapping("/wmsStock/updateStatus")
    public AjaxResult updateStatus(@RequestBody WmsStockInfoVo wmsStockInfoVo);

    /**
     * 查询仓库信息（品质检验冻结查询）
     */
    @PostMapping("/wmsStock/getFreezeStockList")
    public AjaxResult getFreezeStockList(@RequestBody QualityFreezeVo qualityFreezeVo);

    /**
     * 仓库状态批量修改
     */
    @PostMapping("/wmsStock/getUpdate")
    public AjaxResult getUpdate(@RequestBody WarehouseStatusUpdateVo warehouseStatusUpdateVo);

    /**
     * 来料打印页面对应的号码全部删除，上表的打印状态更新为“已完成”
     */
    @PostMapping("/incoming-material-printing-detail/deleteDetail")
    public AjaxResult deleteDetail(@RequestBody DeleteDetailVo deleteDetailVo);

    /**
     * 新增采购退货单
     */
    @PostMapping("/pickingPurchase/addPurchaseFeign")
    public AjaxResult addPurchaseFeign(@RequestBody PickingPurchaseVo pickingPurchaseVo);

    /**
     * 修改库存状态更新为“在库”
     */
    @PostMapping("/wmsStock/updateStockStatus")
    public AjaxResult updateStatus(@RequestBody UpdateStatusVo updateStatusVo);

    /**
     * 删除来料打印页面数据（fegin调用）
     */
    @PostMapping("/incoming-material-printing-detail/deleteData")
    public AjaxResult deleteData(@RequestBody DeleteDetailVo deleteDetailVo);

    /**
     * 库存新增
     */
    @PostMapping("/wmsStock/add")
    public AjaxResult addWmsStock(@Validated @RequestBody WmsStockInfoVo wmsStockInfoVo);

    /**
     * 查看仓库
     */
    @GetMapping("/warehouse/view/{id}")
    public AjaxResult view(@PathVariable("id") Long id);

    /**
     * 新增完工入库
     */
    @PostMapping("/wip-completion/add")
    public AjaxResult wipAdd(@Validated @RequestBody WipCompletionVo wipCompletionVo);

    /**
     * 新增完工入库（其他模块调用）
     */
    @PostMapping("/wip-completion/wipOtherAdd")
    public AjaxResult wipOtherAdd(@RequestBody WipOtherAddVo wipOtherAddVo);

    /**
     * 根据物料号码获取仓库信息
     */
    @GetMapping("/wmsStock/getDataByCategoryAndCode")
    public AjaxResult getDataByCategoryAndCode(@RequestParam("materialNumber") String materialNumber);

    /**
     * 修正母卷条码
     */
    @PutMapping("/updateSpunlace")
    public AjaxResult updateSpunlace(@RequestBody WmsStockInfoVo wmsStockInfoVo);

    /**
     * 查看当前制令单对应的领料明细是否为空
     */
    @PostMapping("/productionPicking/getMoNumber")
    public AjaxResult getMoNumber(@RequestBody FeedVo feedVo);

    /**
     * 新增销售发货单
     */
    @PostMapping("/pickingSale/addSale")
    public AjaxResult addSale(@RequestBody PickingSaleVo pickingSaleVo);

    /**
     * 批次到货入库
     */
    @PostMapping("/purchase-receipt/batchArrival")
    public AjaxResult batchArrival(@RequestBody PurchaseOrderDto purchaseOrderDto);

    /**
     * 根据采购订单状态修改采购入库状态(feign调用)
     */
    @PostMapping("/purchase-receipt/updateReceiptStatus")
    public AjaxResult updateReceiptStatus(@RequestBody UpdateReceiptStatusVo updateReceiptStatusVo);

    /**
     * 根据物料编码获取该物料在仓库中的净重之和(feign调用)
     */
    @GetMapping("/wmsStock/getSum")
    public String getSum(@RequestParam("materialCode") String materialCode);

    /**
     * 根据唯一标识修改状态(feign调用 采购打印)
     */
    @PostMapping("/incoming-material-printing/getDataByOnlyMark")
    public AjaxResult getDataByOnlyMark(@RequestBody ReturnStatusVo returnStatusVo);

    /**
     * 修改生产领料单据状态（品质）
     *
     * @param updateDocVo
     * @return
     * @throws Exception
     */
    @PostMapping("/productionPicking/updateStatus")
    public AjaxResult updateStatus(@RequestBody UpdateDocVo updateDocVo) throws Exception;

    /**
     * 修改委外发货单据状态（品质）
     */
    @PostMapping("/pickingOutsource/outSourceUpdateStatus")
    public AjaxResult outSourceUpdateStatus(@RequestBody UpdateDocVo updateDocVo) throws Exception;

    /**
     * 修改销售发货单据状态（品质）
     */
    @PostMapping("/pickingSale/saleUpdateStatus")
    public AjaxResult saleUpdateStatus(@RequestBody UpdateDocVo updateDocVo) throws Exception;

    /**
     * 修改返工出库单据状态（品质）
     */
    @PostMapping("/pickingComplete/competeUpdateStatus")
    public AjaxResult competeUpdateStatus(@RequestBody UpdateDocVo updateDocVo) throws Exception;

    /**
     * 修改采购退货单据状态（品质）
     */
    @PostMapping("/pickingPurchase/purchaseUpdateStatus")
    public AjaxResult purchaseUpdateStatus(@RequestBody UpdateDocVo updateDocVo) throws Exception;

    /**
     * 修改委外退货单据状态（品质）
     */
    @PostMapping("/pickingReturns/returnUpdateStatus")
    public AjaxResult returnUpdateStatus(@RequestBody UpdateDocVo updateDocVo) throws Exception;

    /**
     * 修改其他出库单据状态（品质）
     */
    @PostMapping("/pickingReturns/restUpdateStatus")
    public AjaxResult restUpdateStatus(@RequestBody UpdateDocVo updateDocVo) throws Exception;

    @PostMapping("/allotManagement/allotUpdateStatus")
    public AjaxResult allotUpdateStatus(@RequestBody UpdateDocVo updateDocVo) throws Exception;

    /**
     * 根据物料编码获取库存重量（feign调用 委外入库页面使用）
     */
    @GetMapping("/wmsStock/getStockWeight")
    public double getStockWeight(@RequestParam("materialCode") String materialCode);

    /**
     * 查询销售发货列表(feign调用) 客诉管理查询使用
     *
     * @param pickingSaleVo
     * @return
     */
    @GetMapping("/pickingSale/ByCustomerComplaintsList")
    public AjaxResult getByCustomerComplaintsList(@RequestParam("pickingSaleVo") PickingSaleVo pickingSaleVo);

    /**
     * 根据物料号码修改库存状态为冻结
     */
    @GetMapping("/wmsStock/updateStatusThaw")
    public void updateStatusThaw(@RequestParam("materialNumber") String materialNumber);

    /**
     * 新增委外入库（自动新增 其他模块插入数据时使用）
     */
    @PostMapping("/subcontract-receipt/addOther")
    public AjaxResult addOther(@RequestBody SubcontractReceiptOtherVo subcontractReceiptOtherVo);

    /**
     * 查询基础信息物料追溯（feign调用 追溯管理页面使用）
     */
    @GetMapping("/wmsStock/getRetrospectManageList")
    public AjaxResult getRetrospectManageList(@RequestParam("wsiCategory") Long wsiCategory, @RequestParam("wsiMaterialNumber") String wsiMaterialNumber);

    /**
     * 查询物料履历（feign调用 物料追溯页面使用）
     */
    @GetMapping("/wmsStock/MaterialResumeList")
    public AjaxResult MaterialResumeList(@RequestParam("wsiCategory") Long wsiCategory, @RequestParam("wsiMaterialNumber") String wsiMaterialNumber);

    /**
     * 查询同批次信息物料追溯（feign调用 物料追溯页面使用）
     */
    @GetMapping("/wmsStock/getRetrospectMaterialList")
    public AjaxResult getRetrospectMaterialList(@RequestParam("wsiMaterialNumber") String wsiMaterialNumber);

    /**
     * 查询同批次信息产品追溯（feign调用 产品追溯页面使用）
     */
    @GetMapping("/wmsStock/getRetrospectProductList")
    public AjaxResult getRetrospectProductList(@RequestParam("codingType") String codingType,@RequestParam("wsiMaterialNumber") String wsiMaterialNumber);

    /**
     * 查询基础信息产品追溯（feign调用 产品追溯页面使用）
     */
    @GetMapping("/wmsStock/getProductTraceabilityList")
    public AjaxResult getProductTraceabilityList(@RequestParam("codingType") String codingType, @RequestParam("wsiMaterialNumber") String wsiMaterialNumber);

    /**
     * 查询产品履历（feign调用 物产品追溯页面使用）
     */
    @GetMapping("/wmsStock/getProductPersonalDetails")
    public AjaxResult getProductPersonalDetails(@RequestParam("codingType") String codingType, @RequestParam("wsiMaterialNumber") String wsiMaterialNumber);

    /**
     * 根据唯一标识获取采购入库单号(feign调用)
     */
    @GetMapping("/incoming-material-printing/getReceiptNo")
    public String getReceiptNo(@RequestParam("onlyMark") String onlyMark);

    /**
     * 根据批次号修改来料打印状态(feign调用)
     */
    @PostMapping("/incoming-material-printing/updatePrintStatus")
    public void updatePrintStatus(@RequestBody UpdatePrintStatusVo updatePrintStatusVo);

    /**
     * 根据母卷号码删除仓库数据（fegin调用）
     */
    @GetMapping("/wmsStock/deleteByMasterVolumeNum")
    public void deleteByMasterVolumeNum(@RequestParam("masterVolumeNum") String masterVolumeNum);

    /**
     * 根据母卷号码查询母卷
     */
    @GetMapping("/wmsStock/selectProductStockInfoById")
    public AjaxResult selectProductStockInfoById(@RequestParam("wsiMaterialNumber") String wsiMaterialNumber);


    /**
     * 脱脂制令单修改时修改相关生产制令单(fegin调用)
     */
    @PostMapping("/productionPicking/updateByDegreas")
    public AjaxResult updateByDegreas(@RequestBody DegreasByUpdateVo degreasByUpdateVo);

    /**
     * 脱脂制令单删除相关生产制令单(fegin调用)
     */
    @GetMapping("/productionPicking/deleteByDegreas")
    public void deleteByDegreas(@RequestParam("degreasOrderNumber") String degreasOrderNumber);

    /**
     * 品质处理修改对应物料等级
     */
    @PostMapping("/wmsStock/updateMaterialGrade")
    public AjaxResult updateMaterialGrade(@RequestBody UpdateGradeVo updateGradeVo);


    /**
     * 销售退货品质检验回传修改数据(品质审核时fegin调用)
     */
    @PostMapping("/sales-return/updateStatusByQuality")
    public AjaxResult updateStatusByQuality(@RequestBody UpdateStatusByQualityVo updateStatusByQualityVo);

    /**
     * 生产退料品质回传状态(fegin调用)
     */
    @PostMapping("/production-material-return/updateProductionMaterialByQuality")
    public AjaxResult updateProductionMaterialByQuality(@RequestBody UpdateStatusByQualityVo updateStatusByQualityVo);

    /**
     * 完工入库品质回传状态(fegin调用)
     */
    @PostMapping("/wip-completion/updatewipCompletionByQuality")
    public AjaxResult updatewipCompletionByQuality(@RequestBody UpdateStatusByQualityVo updateStatusByQualityVo);

    /**
     * 其他入库品质回传状态(fegin调用)
     */
    @PostMapping("/miscellaneous-receipt/updateMiscellaneousReceiptByQuality")
    public AjaxResult updateMiscellaneousReceiptByQuality(@RequestBody UpdateStatusByQualityVo updateStatusByQualityVo);

    /**
     * 完工入库品质回传状态(品质处理fegin调用)
     */
    @PostMapping("/wip-completion/wipCompletionQualityStatus")
    public AjaxResult wipCompletionQualityStatus(@RequestBody ReturnStatusVo returnStatusVo);

    /**
     * 新增（委外订单fegin调用）
     */
    @PostMapping("/pickingOutsource/addPickingOutsource")
    public AjaxResult addPickingOutsource(@RequestBody SubcontractReceiptOtherVo subcontractReceiptOtherVo);

    /**
     * 根据唯一标识修改状态(委外入库 feign调用)
     */
    @PostMapping("/incoming-material-subcontract-printing/getDataByOnlyMarkSub")
    public AjaxResult getDataByOnlyMarkSub(@RequestBody ReturnStatusVo returnStatusVo);

    /**
     * 委外入库状态及数据修改（委外订单关结时 fegin调用）
     */
    @PostMapping("/subcontract-receipt/updateSubcontractReceiptStatus")
    public AjaxResult updateSubcontractReceiptStatus(@RequestBody UpdateReceiptStatusVo updateReceiptStatusVo);

    /**
     * 消息提醒-最小安全库存
     */
    @GetMapping("/wmsStock/maxStock")
    public void maxStock() throws Exception;

    /**
     * 消息提醒-保质期
     */
    @GetMapping("/wmsStock/expirationDate")
    public void expirationDate() throws Exception;

    /**
     * 消息提醒-复检提醒
     */
    @GetMapping("/wmsStock/recheck")
    public void recheck() throws Exception;

    /**
     * 水刺制令单号查询数据（fegin）
     */
    @GetMapping("/productionPicking/spunlaceNumber")
    public AjaxResult spunlaceNumber(@RequestParam("spunlaceOrderNumber") String spunlaceOrderNumber);

    /**
     * 关结委外发货单(fegin调用)
     */
    @PostMapping("/pickingOutsource/closeOutsourceFeign")
    public AjaxResult closeOutsourceFeign(@RequestBody PickingOutsourceFeignVo pickingOutsourceFeignVo);
}
